/*
 * CruceInformacionDAO.java
 *
 * Created on 27 de diciembre de 2006, 04:04 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.consultas.cruceinformacion.dao;

import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.consultas.base.constantes.ConstantesGenerales;
import com.src.computec.radar.consultas.source.ConsultasSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import static com.src.computec.radar.consultas.base.constantes.ConstantesGenerales.SCHEMA;
import com.src.computec.radar.services.utilities.dto.EnvioDto;
import com.src.computec.radar.services.utilities.dto.ParametroBusquedaDto;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

/**
 *
 * @author aocampo
 */
public class CruceInformacionDAO extends GenericDAO implements BaseCruceInformacionDAO {
    
    /** Creates a new instance of CruceInformacionDAO */
    public CruceInformacionDAO() {
    }
    
    private List getEnviosByParametroBusquedaAndSubListBusqueda(ParametroBusquedaDto dto, List subListBusqueda) throws DAOException {
        List listObjects = new ArrayList();
        List listDates = new ArrayList();
        List listEnvios = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String nombreCampo = dto.getNombreCampo();
        String mesesAtras = dto.getMesesAtras();
        String baseQuery = "SELECT E.CODIGO_BARRAS, E.CODIGO_CLIENTE, E.CODIGO_PRODUCTO, E.CODIGO_NODO, E.CODIGO_TIPO_IDENTIFICACION, E.NUMERO_IDENTIFICACION, E.NOMBRE_DESTINATARIO, " +
                           "E.DIRECCION_DESTINATARIO, E.TELEFONO_DESTINATARIO, E.BARRIO_DESTINATARIO, E.CODIGO_TIPO_ENVIO, E.CODIGO_ULTIMA_GESTION, E.PATH_IMAGEN, TE.NOMBRE_TIPO_ENVIO, " +
                           "GE.NOMBRE_GESTION, OP.FECHA_PROCESO, ND.CODIGO_PROVEEDOR, PR.RAZON_SOCIAL, E.CODIGO_DEPARTAMENTO, E.CODIGO_MUNICIPIO, E.CODIGO_CENTROP, DP.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO, " +
                           "E.NUMERO_ORDEN, E.FECHA_ULTIMA_GESTION, ND.NOMBRE_NODO, P.DESCRIPCION_PRODUCTO, PR.PAGINA_WEB, D.CODIGO_INTERNO_CLIENTE, E.CONSECUTIVO_ENVIO, E.ZONA_POSTAL, D.VALOR_TOTAL, D.NUMERO_DOCUMENTO, E.SITIO_ORIGINAL, E.PROBABILIDAD_ENTREGA, E.CODIGO_ARCHIVO, OPA.NOMBRE_ARCHIVO " +
                           "FROM " + SCHEMA + ".ENVIO E " +
                           "INNER JOIN " + SCHEMA + ".DOCUMENTO D ON E.CODIGO_BARRAS = D.CODIGO_BARRAS " +
                           "INNER JOIN " + SCHEMA + ".TIPO_ENVIO TE ON E.CODIGO_TIPO_ENVIO = TE.CODIGO_TIPO_ENVIO " +
                           "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                           "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO_DETALLE OPD ON E.NUMERO_ORDEN = OPD.NUMERO_ORDEN AND E.CODIGO_NODO = OPD.CODIGO_NODO " +
                           "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON OPD.NUMERO_ORDEN = OP.NUMERO_ORDEN " +
                           "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON OPD.CODIGO_NODO = ND.CODIGO_NODO " +
                           "INNER JOIN " + SCHEMA + ".PROVEEDOR PR ON ND.CODIGO_PROVEEDOR = PR.CODIGO_PROVEEDOR " +                                                 
                           "INNER JOIN " + SCHEMA + ".DEPARTAMENTO DP ON E.CODIGO_DEPARTAMENTO = DP.CODIGO_DEPARTAMENTO " +
                           "INNER JOIN " + SCHEMA + ".MUNICIPIO M ON E.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO " +
                           "INNER JOIN " + SCHEMA + ".CENTRO_POBLADO CP ON E.CODIGO_DEPARTAMENTO = CP.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = CP.CODIGO_MUNICIPIO AND E.CODIGO_CENTROP = CP.CODIGO_CENTROP " +
                           "INNER JOIN " + SCHEMA + ".PRODUCTO P ON E.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO " + 
                           "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO_ARCHIVO OPA ON E.CODIGO_ARCHIVO = OPA.CODIGO_ARCHIVO ";
        String baseWhere = "WHERE ";
        String baseGroupBy = " GROUP BY E.CODIGO_BARRAS, E.CODIGO_CLIENTE, E.CODIGO_PRODUCTO, E.CODIGO_NODO, E.CODIGO_TIPO_IDENTIFICACION, E.NUMERO_IDENTIFICACION, E.NOMBRE_DESTINATARIO, " +
                             "E.DIRECCION_DESTINATARIO, E.TELEFONO_DESTINATARIO, E.BARRIO_DESTINATARIO, E.CODIGO_TIPO_ENVIO, E.CODIGO_ULTIMA_GESTION, E.PATH_IMAGEN, TE.NOMBRE_TIPO_ENVIO, " +
                             "GE.NOMBRE_GESTION, OP.FECHA_PROCESO, ND.CODIGO_PROVEEDOR, PR.RAZON_SOCIAL, E.CODIGO_DEPARTAMENTO, E.CODIGO_MUNICIPIO, E.CODIGO_CENTROP, DP.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO, " +
                             "E.NUMERO_ORDEN, E.FECHA_ULTIMA_GESTION, ND.NOMBRE_NODO, P.DESCRIPCION_PRODUCTO, PR.PAGINA_WEB, D.CODIGO_INTERNO_CLIENTE, E.CONSECUTIVO_ENVIO, E.ZONA_POSTAL, D.VALOR_TOTAL, D.NUMERO_DOCUMENTO, E.SITIO_ORIGINAL, E.PROBABILIDAD_ENTREGA, E.CODIGO_ARCHIVO, OPA.NOMBRE_ARCHIVO ";
        String baseOrderBy = "ORDER BY E.NUMERO_ORDEN ASC, E.CODIGO_ARCHIVO ASC, E.CONSECUTIVO_ENVIO ASC WITH UR";
        if (!subListBusqueda.isEmpty()) {
            baseWhere += "D." + nombreCampo + " IN (";
            Iterator iterator = subListBusqueda.iterator();
            int indice = 1;
            while (iterator.hasNext()) {
                String token = (String) iterator.next();
                if (indice != 1) {
                    baseWhere += ", ?";
                }
                else {
                    baseWhere += "?";
                    indice++;
                }
                listObjects.add(token);
            }
            baseWhere += ")";
        }
        if (!codigoCliente.equals("")) {
            baseWhere += " AND OP.CODIGO_CLIENTE = ?";
            listObjects.add(codigoCliente);
        }
        if (!codigoProducto.equals("") && !codigoProducto.equals("-1")) {
            baseWhere += " AND OP.CODIGO_PRODUCTO = ?";
            listObjects.add(codigoProducto);
        }
        if (!mesesAtras.equals("")) {
            baseWhere += " AND OP.FECHA_PROCESO BETWEEN ? AND ?";
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MONTH, -Integer.valueOf(mesesAtras).intValue());
            listDates.add(calendar.getTime());
            calendar.add(Calendar.MONTH, +Integer.valueOf(mesesAtras).intValue());
            listDates.add(calendar.getTime());
        }
        try {
            con = getConnectionDB2();
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseWhere + baseGroupBy + baseOrderBy);
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setString(++indice, (String) iterator.next());
            }
            if (!listDates.isEmpty()) {
                iterator = listDates.iterator();
                while (iterator.hasNext()) {
                    Date date = (Date) iterator.next();
                    statement.setDate(++indice, new java.sql.Date(date.getTime()));
                }
            }
            rs = statement.executeQuery();
            while (rs.next()) {
                int indice1 = 0;
                EnvioDto envioDto = new EnvioDto();
                envioDto.setCodigoBarras(rs.getString(++indice1));
                envioDto.setCodigoCliente(rs.getString(++indice1));
                envioDto.setCodigoProducto(rs.getString(++indice1));
                envioDto.setCodigoNodo(rs.getString(++indice1));
                envioDto.setCodigoTipoIdentificacion(rs.getString(++indice1));
                envioDto.setNumeroIdentificacion(rs.getString(++indice1));
                envioDto.setNombreDestinatario(rs.getString(++indice1));
                envioDto.setDireccionDestinatario(rs.getString(++indice1));
                envioDto.setTelefonoDestinatario(rs.getString(++indice1));
                envioDto.setBarrioDestinatario(rs.getString(++indice1));
                envioDto.setCodigoTipoEnvio(rs.getString(++indice1));
                envioDto.setCodigoUltimaGestion(rs.getString(++indice1));
                envioDto.setPathImagen(rs.getString(++indice1));
                envioDto.setNombreTipoEnvio(rs.getString(++indice1));
                envioDto.setNombreGestion(rs.getString(++indice1));
                envioDto.setFechaProceso(rs.getDate(++indice1));
                envioDto.setCodigoProveedor(rs.getString(++indice1));
                envioDto.setRazonSocialProveedor(rs.getString(++indice1));
                if (envioDto.getPathImagen() != null && !envioDto.getPathImagen().equals("")) {
                    envioDto.setHasPathImagen(true);
                }
                else {
                    envioDto.setHasPathImagen(false);
                }
                envioDto.setCodigoDepartamento(rs.getString(++indice1));
                envioDto.setCodigoMunicipio(rs.getString(++indice1));
                envioDto.setCodigoCentroPoblado(rs.getString(++indice1));
                envioDto.setNombreDepartamento(rs.getString(++indice1));
                envioDto.setNombreMunicipio(rs.getString(++indice1));
                envioDto.setNombreCentroPoblado(rs.getString(++indice1));
                envioDto.setNumeroOrden(rs.getString(++indice1));
                envioDto.setFechaUltimaGestion(rs.getDate(++indice1));
                envioDto.setNombreNodo(rs.getString(++indice1));
                envioDto.setDescripcionProducto(rs.getString(++indice1));
                envioDto.setPaginaWebProveedor(rs.getString(++indice1));
                envioDto.setCodigoInternoCliente(rs.getString(++indice1));
                envioDto.setConsecutivo(rs.getString(++indice1));
                envioDto.setZonaPostal(rs.getString(++indice1));
                envioDto.setValorTotal(rs.getString(++indice1));
                envioDto.setNumeroDocumento(rs.getString(++indice1));
                envioDto.setSitioOriginal(rs.getString(++indice1));
                envioDto.setProbabilidadEntrega(rs.getInt(++indice1));
                if (!envioDto.getCodigoUltimaGestion().equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoGestionDistribucionExterna")) && !envioDto.getCodigoProveedor().equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoProveedorDistribucionExterna"))) {
                    envioDto.setGestionDistribucionExterna(false);
                }
                else {
                    envioDto.setGestionDistribucionExterna(true);
                }
                envioDto.setCodigoArchivo(rs.getString(++indice1));
                envioDto.setNombreArchivo(rs.getString(++indice1));
                listEnvios.add(envioDto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("CruceInformacionDAO:getEnviosByParametroBusquedaAndSubListBusqueda:" + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return listEnvios;
    }
    
    public List getEnviosByParametroBusqueda(ParametroBusquedaDto dto) throws DAOException {
        List listEnvios = new ArrayList();
        List listBusqueda = dto.getListBusqueda();
        List subListBusqueda = null;
        try {
            int sizeListBusqueda = listBusqueda.size();
            int numeroRegistrosPorBloque = Integer.valueOf(ConsultasSource.getInstance().getConsultasSetupKey("numeroRegistrosPorBloque")).intValue();
            int numeroParticiones = sizeListBusqueda / numeroRegistrosPorBloque;
            if ((sizeListBusqueda % numeroRegistrosPorBloque) > 0) {
                numeroParticiones++;
            }
            for (int i=0; i<numeroParticiones;) {
                if (++i < numeroParticiones) {
                    subListBusqueda = listBusqueda.subList((i - 1) * numeroRegistrosPorBloque, i * numeroRegistrosPorBloque);
                }
                else {
                    subListBusqueda = listBusqueda.subList((i - 1) * numeroRegistrosPorBloque, sizeListBusqueda);
                }
                listEnvios.addAll(this.getEnviosByParametroBusquedaAndSubListBusqueda(dto, subListBusqueda));
            }
        }
        catch (Exception e) {
            throw new DAOException("CruceInformacionDAO:getEnviosByParametroBusqueda:" + e.toString(), e);
        }
        return listEnvios;
    }
    
    public void insertMensajeAlerta(String fileName, String ldapUser, int numeroRegistros) throws DAOException {
        Connection con = null;
        PreparedStatement statement = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("INSERT INTO " + SCHEMA + ".MENSAJE_ALERTA (CODIGO_TIPO_ARCHIVO, CODIGO_RESPONSABLE, DESCRIPCION_MENSAJE_ALERTA, ORIGEN_MENSAJE_ALERTA, PATH_MENSAJE_ALERTA, FECHA_REGISTRO, ESTADO) " +
                                             "VALUES (?, ?, ?, ?, ?, ?, ?)");
            int indice = 0;
            statement.setObject(++indice, ConstantesGenerales.FILE_CODE);
            statement.setObject(++indice, ldapUser);
            statement.setObject(++indice, ConstantesGenerales.DESCRIPCION_MENSAJE_ALERTA_CRUCE_INFORMACION.replace("?", Integer.toString(numeroRegistros)));
            statement.setObject(++indice, ConstantesGenerales.FILE_ORIGIN_CRUCE_INFORMACION);
            statement.setObject(++indice, fileName);
            statement.setTimestamp(++indice, new Timestamp((new Date()).getTime()));
            statement.setObject(++indice, ConstantesGenerales.FILE_ACTIVE);
            statement.executeUpdate();
        }
        catch (SQLException e) {
            throw new DAOException("CruceInformacionDAO:insertMensajeAlerta:" + e.toString(), e);
        }
        finally {
            closeConnection(con, statement);
        }
    }
}